home *** CD-ROM | disk | FTP | other *** search
- /*
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
- ┃ 葵ライブラリ ///// Tab Size : 4 ///// ┃
- ┃ ///// Margin : 120 ///// ┃
- ┃ aoi_lib2.c v1.0 L20 ┃
- ┃ ┃
- ┃ (C)K.Konishi 16-Aug-93 ┃
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
- */
-
- #define LIB
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <io.h>
- #include <time.h>
- #include <EGB.h>
- #include <MOS.h>
- #include "Platform.h"
- #include "aoi_lib2.h"
-
- // (aoi_lib2.c は HighC 専用になりました)
- #if !defined(__GNUC__)
- #include <SND.h>
- #include <conio.h>
- #include <msdos.cf>
- #endif
-
- // #define TEST
- // 上の行の//を取るとサンプルプログラムが出来上がります。
-
-
- #define MDCL1 1 /* 色の名前 */
- #define MDCL2 2
- #define MDCL3 3
- #define MDCL4 4
- #define MDCL5 5
- #define MDCL6 9 /* 6から9に変えています */
- #define MDCL7 7
-
- #define BLACK 8
- #define BLUE 9
- #define RED 10
- #define PURPLE 11
- #define GREEN 12
- #define SKYBLUE 13
- #define YELLOW 14
- #define WHITE 15
-
- int AOIpset(short x, short y, short c)
- {
- EGB_color(work, 0, c);
- WORD(para + 0) = 1;
- WORD(para + 2) = x;
- WORD(para + 4) = y;
- return EGB_pset(work, para);
- }
-
- int AOIstring(short x, short y, AOIstringData *Data, char *tx)
- {
- AOIstringData Dt = *Data;
- EGB_color(work, 0, Dt.sc);
- EGB_fontStyle(work, Dt.ss);
- EGB_textZoom(work, 1, Dt.sx, Dt.sy);
- EGB_textZoom(work, 0, Dt.ax, Dt.ay);
- WORD(para + 0) = x;
- WORD(para + 2) = y;
- WORD(para + 4) = strlen(tx);
- strcpy((para + 6), tx);
- return EGB_sjisString(work, para);
- }
-
- int AOIstrSetup(short zsx, short zsy, short zax, short zay, short sf, short sc)
- {
- return EGB_textZoom(work, 1, zsx, zsy)
- | EGB_textZoom(work, 0, zax, zay)
- | EGB_fontStyle(work, sf)
- | EGB_color(work, 0, sc);
- }
-
- int AOIstrSjis(short x, short y, char *tx)
- {
- WORD(para + 0) = x;
- WORD(para + 2) = y;
- WORD(para + 4) = strlen(tx);
- strcpy((para + 6), tx);
- return EGB_sjisString(work, para);
- }
-
- int AOIanyChar(short x, short y, short fx, short fy, char *data)
- {
- WORD(para + 0) = x;
- WORD(para + 2) = y;
- WORD(para + 4) = 0;
- EGB_sjisString(work, para); /* 座標設定用ダミー */
- return EGB_anyChar(work, fx, fy, data);
- }
-
- int AOIline(short x0, short y0, short x1, short y1, short c)
- {
- EGB_color(work, 0, c);
- WORD(para + 0) = 2;
- WORD(para + 2) = x0;
- WORD(para + 4) = y0;
- WORD(para + 6) = x1;
- WORD(para + 8) = y1;
- return EGB_connect(work, para);
- }
-
- int AOIconnectLeft(short x0, short y0, short x1, short y1, short c)
- {
- EGB_color(work, 0, c);
- WORD(para + 0) = 3;
- WORD(para + 2) = x0;
- WORD(para + 4) = y1;
- WORD(para + 6) = x0;
- WORD(para + 8) = y0;
- WORD(para + 10) = x1;
- WORD(para + 12) = y0;
- return EGB_connect(work, para);
- }
-
- int AOIconnectRight(short x0, short y0, short x1, short y1, short c)
- {
- EGB_color(work, 0, c);
- WORD(para + 0) = 3;
- WORD(para + 2) = x0;
- WORD(para + 4) = y1;
- WORD(para + 6) = x1;
- WORD(para + 8) = y1;
- WORD(para + 10) = x1;
- WORD(para + 12) = y0;
- return EGB_connect(work, para);
- }
-
- int AOIbox(short x0, short y0, short x1, short y1, short c)
- {
- EGB_color(work, 0, c);
- WORD(para + 0) = x0;
- WORD(para + 2) = y0;
- WORD(para + 4) = x1;
- WORD(para + 6) = y1;
- return EGB_rectangle(work, para);
- }
-
- int AOIboxFull(short x0, short y0, short x1, short y1, int c)
- {
- int ret = 0;
-
- if (y0 > y1) {
- y1 ^= y0; y0 ^= y1; y1 ^= y0;
- x1 ^= x0; x0 ^= x1; x1 ^= x0;
- }
- ret = EGB_color(work, 0, c);
- WORD(para + 0) = 2;
- WORD(para + 2) = x0;
- WORD(para + 6) = x1;
- for (; y0 <= y1; y0++) {
- WORD(para + 4) = y0;
- WORD(para + 8) = y0;
- ret += EGB_connect(work, para);
- }
- return ret;
- }
-
- int AOIwinBase(short x, short y, short lx, short ly, short sd)
- {
- int i = 0;
-
- if (sd == 1) {
- EGB_pastel(work, 128);
- i = AOIboxFull(x + lx + 1, y + 6, x + lx + 6, y + ly + 7, MDCL1)
- | AOIboxFull(x + 6, y + ly + 1, x + lx + 6, y + ly + 7, MDCL1);
- }
- return i
- | AOIboxFull(x, y, x + lx, y + ly, MDCL6)
- | AOIconnectLeft (x , y , x + lx - 1, y + ly - 1, WHITE)
- | AOIconnectRight(x , y , x + lx , y + ly , MDCL1)
- | AOIconnectLeft (x + 4, y + 4, x + lx - 5, y + ly - 5, MDCL1)
- | AOIconnectRight(x + 4, y + 4, x + lx - 4, y + ly - 4, WHITE);
- }
-
- int AOIbuttonBase(short x, short y, short lx, short ly)
- {
- return AOIboxFull(x + 1, y + 1, x + lx - 1, y + ly - 1, MDCL6)
- | AOIconnectLeft (x, y, x + lx - 1, y + ly - 1, WHITE)
- | AOIconnectRight(x, y, x + lx , y + ly , MDCL1);
- }
-
- int AOIsetPalette(int cn, int cg, int cr, int cb)
- {
- DWORD(para + 0) = 1;
- DWORD(para + 4) = cn; /* cn 色識別番号 */
- BYTE(para + 8) = cb * 17; /* cb 青 */
- BYTE(para + 9) = cr * 17; /* cr 赤 */
- BYTE(para + 10) = cg * 17; /* cg 緑 */
- BYTE(para + 11) = 0;
- return EGB_palette(work, 1, para); /* display レイヤ表示 */
- }
-
- int AOIsetPalette256(int cn, int cg, int cr, int cb)
- {
- DWORD(para + 0) = 1;
- DWORD(para + 4) = cn; /* cn 色識別番号 */
- BYTE(para + 8) = cb * 257; /* cb 青 */
- BYTE(para + 9) = cr * 257; /* cr 赤 */
- BYTE(para + 10) = cg * 257; /* cg 緑 */
- BYTE(para + 11) = 0;
- return EGB_palette(work, 1, para); /* display レイヤ表示 */
- }
-
- int AOIcolorIGRB(int g, int r, int b)
- {
- return EGB_colorIGRB(work, 0, g * 0x10000 + r * 0x100 + b);
- }
-
- int AOIsetStandardPalette(void)
- {
- return AOIsetPalette( 8, 0, 0, 0)
- | AOIsetPalette( 9, 0, 0, 15)
- | AOIsetPalette(10, 0, 15, 0)
- | AOIsetPalette(11, 0, 15, 15)
- | AOIsetPalette(12, 15, 0, 0)
- | AOIsetPalette(13, 15, 0, 15)
- | AOIsetPalette(14, 15, 15, 0)
- | AOIsetPalette(15, 15, 15, 15);
- }
-
- short AOIbin2short(char *bin)
- {
- short len;
- short i;
- short ret = 0;
-
- len = strlen(bin);
- for (i = 0; i < len; i++) {
- ret <<= 1;
- if (bin[i] == '1') ret++;
- else if (bin[i] != '0') return 0;
- }
-
- return ret;
- }
-
- long AOIbin2long(char *bin)
- {
- short len;
- short i;
- long ret = 0;
-
- len = strlen(bin);
- for (i = 0; i < len; i++) {
- ret <<= 1;
- if (bin[i] == '1') ret++;
- else if (bin[i] != '0') return 0;
- }
-
- return ret;
- }
-
- void AOIsetButton(AOIbuttonData *Data, short x, short y, short lx, short ly)
- {
- AOIbuttonData bData;
-
- bData.x = x;
- bData.y = y;
- bData.lx = lx;
- bData.ly = ly;
- *Data = bData;
- }
-
- int AOIbutton(short sx, short sy, int mx, int my, AOIbuttonData *Data)
- {
- AOIbuttonData *Dt = Data;
- int i;
-
- for (i = 0; i <= BUTTON; i++) {
- if (sx + Dt[i].x < mx && mx < sx + Dt[i].x + Dt[i].lx && sy + Dt[i].y < my && my < sy + Dt[i].y + Dt[i].ly) {
- return i;
- }
- }
- return -1;
- }
-
- void _AOIfigureDrawSet(short *fig, short *a)
- {
- short *da = a;
-
- switch (*fig) {
- case 0 :
- da[1] = da[2] = da[3] = da[4] = da[5] = da[7] = 1;
- break;
- case 1 :
- da[4] = da[5] = 1;
- break;
- case 2 :
- da[1] = da[4] = da[6] = da[3] = da[7] = 1;
- break;
- case 3 :
- da[1] = da[4] = da[6] = da[5] = da[7] = 1;
- break;
- case 4 :
- da[2] = da[6] = da[4] = da[5] = 1;
- break;
- case 5 :
- da[1] = da[2] = da[6] = da[5] = da[7] = 1;
- break;
- case 6 :
- da[1] = da[2] = da[3] = da[6] = da[5] = da[7] = 1;
- break;
- case 7 :
- da[1] = da[2] = da[4] = da[5] = 1;
- break;
- case 8 :
- da[1] = da[2] = da[3] = da[4] = da[5] = da[6] = da[7] = 1;
- break;
- case 9 :
- da[1] = da[2] = da[4] = da[5] = da[6] = da[7] = 1;
- break;
- }
- }
-
- void AOIfigureDraw(short sx, short sy, short figure) /* 2桁の数字を12ドットで表示します */
- {
- short a[8];
- short fig[3]; /* fig[1] : 10の位 fig[2] : 1の位 */
- short i, j;
-
- for (i = 0; i <= 7; i++) a[i] = 0;
- for (i = 0; i <= 2; i++) fig[i] = 0;
-
- if (figure < 0) figure = 0; /* 負の数は0にする */
-
- fig[1] = figure / 10;
- fig[2] = figure - fig[1] * 10;
- for (i = 1; i != 3; i++) {
- _AOIfigureDrawSet(&fig[i], a);
-
- if (i == 2) sx += 10;
-
- AOIline(sx + 1, sy , sx + 5, sy , a[1] == 1 ? 15 : 8);
- AOIline(sx , sy , sx , sy + 5, a[2] == 1 ? 15 : 8);
- AOIline(sx , sy + 7, sx , sy + 12, a[3] == 1 ? 15 : 8);
- AOIline(sx + 6, sy , sx + 6, sy + 5, a[4] == 1 ? 15 : 8);
- AOIline(sx + 6, sy + 7, sx + 6, sy + 12, a[5] == 1 ? 15 : 8);
- AOIline(sx + 1, sy + 6, sx + 5, sy + 6, a[6] == 1 ? 15 : 8);
- AOIline(sx + 1, sy + 12, sx + 5, sy + 12, a[7] == 1 ? 15 : 8);
- for (j = 0; j <= 7; j++) a[j] = 0;
- }
- }
-
- void AOIfigureDraw2(short sx, short sy, int figure) /* 2桁の数字を25ドットで表示します */
- {
- short a[8];
- short fig[3]; /* fig[1] : 10の位 fig[2] : 1の位 */
- short i, j, k;
- short m = 0, n;
-
- for (i = 0; i <= 7; i++) a[i] = 0;
- for (i = 0; i <= 2; i++) fig[i] = 0;
-
- if (figure < 0) figure = 0; /* 負の数は0にする */
-
- fig[1] = figure / 10;
- fig[2] = figure - fig[1] * 10;
- for (i = 1; i != 3; i++) {
- _AOIfigureDrawSet(&fig[i], a);
-
- if (i == 2) sx += 20;
- for (k = 0; k < 4; k++) {
- sx += k;
- if (k == 0 || k == 3) m = 1;
- else m = 0;
- for (n = 0; n < 2; n++) {
- AOIline(sx + n * 11, sy + 3 + m, sx + n * 11, sy + 11 - m, a[2 + n * 2] == 1 ? 14 : 8);
- AOIline(sx + n * 11, sy + 14 + m, sx + n * 11, sy + 22 - m, a[3 + n * 2] == 1 ? 14 : 8);
- }
- sx -= k;
- }
- for (k = 0; k < 4; k++) {
- sy += k;
- if (k == 0 || k == 3) m = 1;
- else m = 0;
- AOIline(sx + 3 + m, sy , sx + 11 - m, sy , a[1] == 1 ? 14 : 8);
- AOIline(sx + 3 + m, sy + 11, sx + 11 - m, sy + 11, a[6] == 1 ? 14 : 8);
- AOIline(sx + 3 + m, sy + 22, sx + 11 - m, sy + 22, a[7] == 1 ? 14 : 8);
- sy -= k;
- }
- for (j = 0; j <= 7; j++) a[j] = 0;
- }
- }
-
- short _AOIrandom(short max) /* 0~99までの特殊用途乱数発生 */
- {
- short max10, max1;
- short ret10, ret1;
-
- max10 = max / 10;
- do {
- ret10 = (rand() % 10);
- } while (max10 < ret10);
- ret1 = (rand() % 10);
- if (max10 == ret10) {
- max1 = max - max10 * 10;
- while (max1 < ret1) {
- ret1 = (rand() % 10);
- }
- }
- return ret10 * 10 + ret1;
- }
-
- long AOIrandom(long max) /* 0~999999までの乱数発生 */
- {
- time_t *t = 0;
-
- srand((unsigned int)time(t));
- if (max > 9999) {
- return _AOIrandom(max / 10000) * 10000
- + _AOIrandom(99) * 100
- + _AOIrandom(99);
- }
- if (max > 99) {
- return _AOIrandom(max / 100) * 100
- + _AOIrandom(99);
- }
- return _AOIrandom(99);
- }
-
- int AOIbuttonLamp(short sx, short sy, AOIbuttonData *Data) /* ボタン部分を反転 */
- {
- AOIbuttonData Dt = *Data;
-
- return EGB_writeMode(work, 4)
- | MOS_disp(0)
- | AOIboxFull(sx + Dt.x, sy + Dt.y, sx + Dt.x + Dt.lx, sy + Dt.y + Dt.ly, 15)
- | MOS_disp(1)
- | EGB_writeMode(work, 0);
- }
-
- int AOIslantingBox(short x0, short y0, short x1, short y1, short lx, short cl)
- {
- if (x0 == x1) return AOIbox(x0, y0, x0 + lx, y1, cl);
- if (y0 == y1) return AOIline(x0, y0, x1 + lx, y0, cl);
-
- if (y0 > y1) {
- y1 ^= y0; y0 ^= y1; y1 ^= y0;
- x1 ^= x0; x0 ^= x1; x1 ^= x0;
- }
-
- EGB_color(work, 0, cl);
- WORD(para + 0) = 5;
- WORD(para + 2) = x0;
- WORD(para + 4) = y0;
- WORD(para + 6) = x1;
- WORD(para + 8) = y1;
- WORD(para + 10) = x1 + lx;
- WORD(para + 12) = y1;
- WORD(para + 14) = x0 + lx;
- WORD(para + 16) = y0;
- WORD(para + 18) = x0;
- WORD(para + 20) = y0;
- return EGB_connect(work, para);
-
- }
-
- int AOIslantingBoxFull(short x0, short y0, short x1, short y1, short lx, short cl)
- {
- short dmmy_x0;
-
- if (x0 == x1) return AOIbox(x0, y0, x0 + lx, y1, cl);
- if (y0 == y1) return AOIline(x0, y0, x1 + lx, y0, cl);
-
- if (y0 > y1) {
- y1 ^= y0; y0 ^= y1; y1 ^= y0;
- x1 ^= x0; x0 ^= x1; x1 ^= x0;
- }
-
- EGB_color(work, 0, cl);
- WORD(para + 0) = 2;
- dmmy_x0 = x0 + lx;
- for (;x0 <= dmmy_x0; x0++, x1++) {
- WORD(para + 2) = x0;
- WORD(para + 4) = y0;
- WORD(para + 6) = x1;
- WORD(para + 8) = y1;
- EGB_connect(work, para);
- }
- return 1;
- }
-
- #if !defined(__GNUC__)
-
- int AOIpadCheck(int *status) /* パッドの押されたボタン番号を返します。 */
- {
- int old = 0;
-
- SND_joy_in_2(0, status);
- old = *status;
- if ((*status | 1) != old) return 0;
- if ((*status | 2) != old) return 1;
- if ((*status | 4) != old) return 2;
- if ((*status | 8) != old) return 3;
- if ((*status | 16) != old) return 4;
- if ((*status | 32) != old) return 5;
- if ((*status | 64) != old) return 6;
- if ((*status | 128) != old) return 7;
- return -1;
- }
-
- int AOIpadCheck2(int *status, int a[])
- {
- int old = 0;
- int i;
-
- for (i = 0; i < 8; i++) a[i] = 0; /* 配列初期化 */
- SND_joy_in_2(0, status);
- old = *status;
- if ((*status | 1) != old) a[0] = 1;
- if ((*status | 2) != old) a[1] = 1;
- if ((*status | 4) != old) a[2] = 1;
- if ((*status | 8) != old) a[3] = 1;
- if ((*status | 16) != old) a[4] = 1;
- if ((*status | 32) != old) a[5] = 1;
- if ((*status | 64) != old) a[6] = 1;
- if ((*status | 128) != old) a[7] = 1;
- return TRUE;
- }
-
- #endif
-
- void ank2sjis(char string[], char str[])
- {
- short i = 0, j = 0;
- char sjiscode[257][3] = {
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
- " ", "!", "”", "#", "$", "%", "&", "’", "(", ")", "*", "+", ",", "-", ".", "/",
- "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
- "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
- "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "〔", "¥", "〕", "^", "_",
- "’", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
- "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", " ̄", " ",
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
- " ", "。", "「", "」", "、", "・", "ヲ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ",
- "ー", "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ",
- "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ",
- "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ン", "゛", "゜",
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
- " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "
- };
-
- while (str[i] != '\0') {
- if ((0x81 <= str[i] && str[i] <= 0x9f) || (0xe0 <= str[i] && str[i] <= 0xef)) { // 全角のとき
- string[j++] = str[i++];
- string[j++] = str[i++];
- } else { // 半角のとき
- string[j++] = sjiscode[str[i]][0];
- string[j++] = sjiscode[str[i]][1];
- i++;
- }
- }
- string[j] = '\0';
- }
-
-
- /* Oh!FMTOWNS 1992/3より抜粋 */
- unsigned int sjisToJis(unsigned int sjis)
- {
- unsigned int h, l;
-
- h = (sjis >> 8) & 0xff;
- l = sjis & 0xff;
-
- if ( ((h > 0x9f) && (h < 0xe0)) || (h < 0x81) || (h > 0xef) || (l < 0x40) || (l > 0xfe) || (l == 0x7f) ) {
- return 0x2129;
- }
- if (l > 0x7f) l--;
- h -= (h <= 0x9f) ? 0x70 : 0xb0;
- h <<= 1;
- if (l >= 0x9e) l -= 0x5e + 0x1f;
- else {
- l -= 0x1f;
- h--;
- }
-
- return (h << 8) + l;
- }
-
- long _AOIgetFontAddress(char st[], short fs)
- { /* 文字列 st の先頭文字のフォントファイル上の番地を返す */
- short i = 0, k = 0;
- long j;
- int jisCode;
- int address; /* 表示する文字のフォントファイル上の番地 */
- long firstAdr; /* フォントファイル上で全角文字が始まる番地 */
- long stepAdr; /* フォントファイル上の次のブロックまでのバイト数 */
- long fontS; /* 1文字分のバイト数 */
- jisCode = sjisToJis((st[0] << 8) + st[1]);
- /* 文字列 st の先頭文字のJISコードを得る */
- do { /* 文字列 st を1文字分ずらす */
- st[i] = st[i + 2];
- st[i + 1] = st[i + 3];
- i += 2;
- } while (st[i] != '\0');
-
- if (fs == 16 && jisCode >= 0x5020) return 3072;
- /* 12ドットの第2水準は空白置き換え */
- switch (fs) {
- case 64 : /* 60ドットファイルの各種番地 */
- firstAdr = 61440;
- stepAdr = 45120;
- fontS = 480;
- break;
- case 48 : /* 48ドットファイルの各種番地 */
- firstAdr = 36880;
- stepAdr = 27072;
- fontS = 288;
- break;
- case 32 : /* 32ドットファイルの各種番地 */
- firstAdr = 16400;
- stepAdr = 12032;
- fontS = 128;
- break;
- case 24 : /* 24ドットファイルの各種番地 */
- firstAdr = 0x12;
- stepAdr = 0x1B2C;
- fontS = 0x47 + 3;
- break;
- case 16 : /* 12ドットファイルの各種番地 */
- firstAdr = 3072;
- stepAdr = 2256;
- fontS = 24;
- break;
- }
- /* フォントファイル上の番地を計算する */
- for (j = 0x2120; j < 0x7427; j += 0x100) {
- if (j <= jisCode && jisCode <= j + 0x5f) {
- address = firstAdr + fontS * (jisCode - j - 1) + stepAdr * k;
- j = 0xFFFF;
- }
- k++;
- }
-
- return address;
- }
-
- void AOIstrFJ2(FILE *fp, short fs, short sx, short sy, char st[], short gap)
- { /* 全角の文字列を fp で示されるフォントで表示する */
- short lenSt; /* 残りの文字数 */
- short fs2; /* 8で割り切れない大きさのフォント用のダミー */
- char *data; /* フォントデータ格納番地 */
-
- fs2 = fs;
- if (fs == 60) { /* 60ドットは64ドットとして処理 */
- fs2 = fs = 64;
- gap -= 4;
- }
- if (fs == 12) { /* 12ドットは一部16ドットとして処理 */
- fs = 16;
- gap -= 4;
- }
- lenSt = (short)strlen(st) >> 1;
- /* lenSt に文字数を代入(全部全角文字と考え2で割っている) */
- fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET); /* 得られた番地までシークする */
- data = (char *)malloc(fs2 * fs * sizeof(char)); /* フォントデータ格納領域確保 */
- while (!feof(fp) && lenSt) { /* 残りの文字数が0になるまで */
- fread(data, sizeof(char), (fs >> 3) * fs2, fp); /* フォントデータを1文字分読み込む */
- AOIanyChar(sx, sy, fs2, fs2, data); /* 1文字描画 */
- sx += (fs + gap);
- lenSt--; /*残りの文字数を1減らす */
- fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);/* 得られた番地までシークする */
- }
- free(data); /* フォントデータ格納領域解放 */
- }
-
- void AOIstring_FJ2(FILE *fp, short fs, short sx, short sy, char st[], short sc, short gap)
- {
- EGB_color(work, 0, sc);
- EGB_textZoom(work, 1, fs, fs);
- AOIstrFJ2(fp, fs, sx, sy, st, gap);
- }
-
- void AOIstrFJ2Zoom(FILE *fp, short fs, short sx, short sy, char st[], short sc, short gap, short zx, short zy)
- {
- EGB_color(work, 0, sc);
- EGB_textZoom(work, 1, zx, zy);
- AOIstrFJ2(fp, fs, sx, sy, st, gap + (zx - fs));
- }
-
- /*
- short _AOIstrFJ2setup_FontSearch(char fj2File[]) // HD と CDROMにあるFJ2フォントを捜索します。(-_-;)
- {
- char fj2Drv[][3] = {"d:", "e:", "f:", "g:", "h:", "i:", "j:", "k:", "l:", "m:", "n:", "o:", "p:", "q:"};
- char fj2FileName[50];
- short drvNum, endMark, retFntFileChk;
-
- strcpy(fj2FileName, fj2File);
- fj2File[0] = '\0';
- endMark = 0;
- drvNum = 0;
- do {
- strcpy(fj2File, fj2Drv[drvNum]);
- strcat(fj2File, fj2FileName);
- retFntFileChk = _access(fj2File, 1);
- // printf("%s\n", fj2File);
- // printf("%d\n", retFntFileChk);
- drvNum++;
- if (drvNum == 15) endMark = 1;
- } while (retFntFileChk != 0 && endMark != 1);
-
- if (endMark == 1) {
- return FALSE;
- } else {
- return TRUE;
- }
- }
-
- enum {MINN, GOTH, MARU, KYOU, MOUH};
-
- int _AOIstrFJ2setup_FontNameMake(char fj2File[], short fontSize)
- {
- if (_AOIstrFJ2setup_FontSearch(fj2File) == FALSE) { // fj2フォントの居所が不明のときは、FALSEを返す
- return FALSE;
- }
-
- }
-
- int AOIstrFJ2setup(FILE *fp, short fontName, short fontSizeX, short fontSizeY, short fontStyle, short color)
- {
- char fj2File[50];
- char string[256];
- FILE *fp1;
-
- if (_AOIstrFJ2setup_FontNameMake(fj2File, maxof(fontSizeX, fontSizeY)) == FALSE) {
- // fj2フォントの居所が不明のときは、FALSEを返す
- return FALSE;
- }
-
- EGB_textZoom(work, 1, fontSizeX, fontSizeY)
- EGB_textZoom(work, 0, fontSizeX, fontSizeY)
- EGB_fontStyle(work, fontStyle)
- EGB_color(work, 0, color);
-
-
- }
-
- void AOIstrFJ2(FILE *fp, short fs, short sx, short sy, char st[], short gap)
- { // 全角の文字列を fp で示されるフォントで表示する
- short lenSt; // 残りの文字数
- short fs2; // 8で割り切れない大きさのフォント用のダミー
- char *data; // フォントデータ格納番地
-
- fs2 = fs;
- if (fs == 60) { // 60ドットは64ドットとして処理
- fs2 = fs = 64;
- gap -= 4;
- }
- if (fs == 12) { // 12ドットは一部16ドットとして処理
- fs = 16;
- gap -= 4;
- }
- lenSt = (short)strlen(st) >> 1;
- // lenSt に文字数を代入(全部全角文字と考え2で割っている)
- fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET); // 得られた番地までシークする
- data = (char *)malloc(fs2 * fs * sizeof(char)); // フォントデータ格納領域確保
- while (!feof(fp) && lenSt) { // 残りの文字数が0になるまで
- fread(data, sizeof(char), (fs >> 3) * fs2, fp); // フォントデータを1文字分読み込む
- AOIanyChar(sx, sy, fs2, fs2, data); // 1文字描画
- sx += (fs + gap);
- lenSt--; //残りの文字数を1減らす
- fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);// 得られた番地までシークする
- }
- free(data); // フォントデータ格納領域解放
- }
- */
-
-
- short _AOIsystem12FontSetup(char fnt12File[])
- // ハードディスクにある12ドットフォントを捜索します。(-_-;)
- {
- char fnt12Drv[][3] = {"d:", "e:", "f:", "g:", "h:", "i:", "j:", "k:", "l:", "m:", "n:", "o:", "p:"};
- char fnt12FileName[] = "\\sysinit\\system.fnt";
- short drvNum, endMark, retFntFileChk;
-
- endMark = 0;
- drvNum = 0;
- do {
- strcpy(fnt12File, fnt12Drv[drvNum]);
- strcat(fnt12File, fnt12FileName);
- retFntFileChk = _access(fnt12File, 1);
- // printf("%s\n", fnt12File);
- // printf("%d\n", retFntFileChk);
- drvNum++;
- if (drvNum == 14) endMark = 1;
- } while (retFntFileChk != 0 && endMark != 1);
-
- if (endMark == 1) {
- return FALSE;
- } else {
- return TRUE;
- }
- }
-
- void AOIsystem16Font(short x, short y, short c, char *str)
- {
- AOIstringData AstringD;
-
- AstringD.sx = 12;
- AstringD.sy = 12;
- AstringD.ax = 6;
- AstringD.ay = 12;
- AstringD.sc = c;
- AstringD.ss = 0x0;
- AOIstring(x, y, &AstringD, str);
- }
-
- void AOIsystem12Font(short x, short y, short c, char *str)
- {
- char fnt12File[50];
- char string[256];
- FILE *fp1;
-
- if (_AOIsystem12FontSetup(fnt12File) == FALSE) { // 12ドットフォントの居所が不明のときは、16ドットで代用
- AOIsystem16Font(x, y + 12, c, str);
- return;
- }
- // printf("%s", fnt12File);
- if ((fp1 = fopen(fnt12File, "rb")) == NULL) {
- perror("system.fnt のオープンを失敗しました");
- } else {
- ank2sjis(string, str);
- AOIstring_FJ2(fp1, 12, x, y + 12, string, c, 0);
- }
-
- fclose(fp1);
- return;
- }
-
- int AOIgetGraph(char *buf, short x0, short y0, short x1, short y1) /* 画像データ画面の読み込み */
- {
- DWORD(para + 0) = (unsigned int)buf;
- WORD (para + 4) = 0x14 /* getds() */;
- WORD (para + 6) = x0;
- WORD (para + 8) = y0;
- WORD (para + 10) = x1;
- WORD (para + 12) = y1;
- return EGB_getBlock(work, para); /* ドットデータの読み込み1 */
-
- }
-
- int AOIgetGraphZoom(char *buf, short x0, short y0, short x1, short y1, short xs, short ys) /* 画像データ画面の読み込み */
- {
- DWORD(para + 0) = (unsigned int)buf;
- WORD (para + 4) = 0x14 /* getds() */;
- WORD (para + 6) = x0;
- WORD (para + 8) = y0;
- WORD (para + 10) = x1;
- WORD (para + 12) = y1;
- WORD (para + 14) = xs;
- WORD (para + 16) = ys;
- return EGB_getBlock(work, para); /* ドットデータの読み込み2 */
-
- }
-
- int AOIputGraph(char *buf, short x0, short y0, short x1, short y1) /* 画像データ画面の書き込み */
- {
- DWORD(para + 0) = (unsigned int)buf;
- WORD (para + 4) = 0x14 /* getds() */;
- WORD (para + 6) = x0;
- WORD (para + 8) = y0;
- WORD (para + 10) = x1;
- WORD (para + 12) = y1;
- return EGB_putBlock(work, 0, para); /* ドットデータの書き込み1 */
- }
-
- int AOIputGraphZoom(char *buf, short x0, short y0, short x1, short y1, short xs, short ys)
- /* 画像データ画面の書き込み */
- {
- DWORD(para + 0) = (unsigned int)buf;
- WORD (para + 4) = 0x14 /* getds() */;
- WORD (para + 6) = x0;
- WORD (para + 8) = y0;
- WORD (para + 10) = x1;
- WORD (para + 12) = y1;
- WORD (para + 14) = xs;
- WORD (para + 16) = ys;
- return EGB_putBlockZoom(work, 0, para); /* ドットデータの書き込み2 */
- }
-
- void AOIwindowMove(char *dispTmp, short *sx, short *sy, short lx, short ly) /* ウインドゥ移動 */
- {
- int ch, mx, my;
- int dx, dy;
- char dispTmp2[(640 / 8) * 480]; /* ドットデータの読み書き作業領域 */
-
- MOS_disp(0);
- AOIgetGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
- AOIputGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
- MOS_typeRom(83 + 1, 8, 8, pat_work); /* マウスを手の平に */
- MOS_disp(1);
- EGB_writeMode(work, 4);
- EGB_linePattern(work, 1, 0x55555555);
-
- MOS_rdpos(&ch, &mx, &my);
- dx = mx - *sx;
- dy = my - *sy;
-
- do {
- MOS_rdpos(&ch, &mx, &my);
- *sx = mx - dx;
- *sy = my - dy;
- MOS_disp(0);
- AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
- AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
- MOS_disp(1);
- } while (ch == 1);
-
- EGB_linePattern(work, 1, 0xffffffff);
- EGB_writeMode(work, 0);
- MOS_disp(0);
- MOS_typeRom(80 + 1, 0, 0, pat_work); /* マウスを元通り */
- AOIgetGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
- AOIputGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
- MOS_disp(1);
- }
-
- int AOItiff(int sx, int sy, char filename[100]) /* 廃止 拡張ライブラリIの方を使用せよ */
- {
- FILE *fp;
- char *data;
- short x[1], y[1], bit[1];
- long allBit;
-
- if ((fp = fopen(filename, "rb")) == NULL) { /* ファイルオープン */
- perror("ファイルのオープンを失敗しました");
- return FALSE;
- }
- fseek(fp, 0x001e, SEEK_SET); fread(x, sizeof(short), 1, fp); /* ドット数読み込み */
- fseek(fp, 0x002a, SEEK_SET); fread(y, sizeof(short), 1, fp);
- fseek(fp, 0x0036, SEEK_SET); fread(bit, sizeof(short), 1, fp); /* ビット数読み込み */
- /* printf("%d %d %d", x[0], y[0], bit[0]); */
- switch (bit[0]) {
- case 4 :
- allBit = x[0] * y[0] / 2; break;
- case 8 :
- allBit = x[0] * y[0]; break;
- case 16 :
- allBit = x[0] * y[0] * 2; break;
- }
- data = (char *)malloc(allBit * sizeof(char)); /* データ格納領域確保 */
- fseek(fp, 0x0200, SEEK_SET); fread(data, sizeof(char), allBit, fp); /* 画像読み込み */
- free(data); /* 動的に確保した領域の開放 */
- fclose(fp);
- DWORD(para + 0) = (unsigned int)data;
- WORD (para + 4) = 0x14;
- WORD (para + 6) = sx;
- WORD (para + 8) = sy;
- WORD (para + 10) = sx + x[0] - 1;
- WORD (para + 12) = sx + y[0] - 1;
- return EGB_putBlock(work, 0, para); /* 画像描画 */
- }
-
- void AOIwide17(void) /* WIDE display set */
- /* 戸田 氏 の ゴットトランスファー の ソースリスト を参照 */
- {
- int i;
- int para[10][2] = {
- { 0, 80 }, /* HSW1 */
- { 1, 590 }, /* HSW2 */
- { 4, 669 }, /* HST */
- { 29, 3 }, /* CKI */
- { 9, 130 }, /* HDS0 */
- { 11, 130 }, /* 1 */
- { 18, 130 }, /* HAJ0 */
- { 22, 130 }, /* 1 */
- { 10, 642 }, /* HDE0 */
- { 12, 642 } /* 1 */
- };
-
- for(i = 0; i < 10; i++) {
- _outw(0x440, para[i][0]);
- _outw(0x442, para[i][1]);
- }
- }
-
- void AOIwide3(void) /* WIDE display set */
- {
- int i;
- int para[14][2] = {
- { 0, 110 }, /* HSW1 */
- { 1, 802 }, /* HSW2 */
- { 4, 909 }, /* HST */
- { 29, 0 }, /* CKI */
- { 18, 130 }, /* HAJ0 */
- { 22, 130 }, /* 1 */
-
- { 9, 138 }, /* HDS0 */
- { 11, 138 }, /* 1 */
- { 10, 898 }, /* HDE0 */
- { 12, 898 }, /* 1 */
-
- { 13, 53 }, /* VDS0 */
- { 15, 53 }, /* 1 */
- { 14, 1200/*106*/ }, /* VDE0 */
- { 16, 1200/*106*/ } /* 1 */
- };
-
- for(i = 0; i < 14; i++) {
- outpw(0x440, para[i][0]);
- outpw(0x442, para[i][1]);
- }
- }
-
- short AOItownsName(void) /* TOWNSの機種判別 */
- {
- short m;
-
- switch (m = _inp(0x31)) {
- case 1..5 :
- break;
- default :
- m = 0; break;
- }
- return m; /* 1 : 初代 2 : 2代目 3 : 3代目 4 : IIUX 5 : IICX */
- }
-
-
- // サンプルプログラムは 13行目の // を取ってください
-
- #ifdef TEST
-
- void main(void)
- {
- AOIstringData AstringD; /* AOIstringData型の変数宣言 */
- int i;
- FILE *fp;
-
- EGB_init(work, EgbWorkSize);
- EGB_resolution(work, 0, 3);
- EGB_resolution(work, 1, 3);
- EGB_writePage(work, 0);
-
- AOIsetPalette( 1, 0, 9, 15);
- AOIsetPalette( 2, 0, 8, 0);
- AOIsetPalette( 3, 0, 8, 8);
- AOIsetPalette( 4, 8, 0, 0);
- AOIsetPalette( 5, 8, 0, 8);
- AOIsetPalette( 6, 12, 12, 12);
- AOIsetPalette( 7, 7, 7, 7);
- AOIsetPalette( 8, 2, 2, 2);
- AOIsetPalette( 9, 11, 12, 15);
- AOIsetPalette(10, 0, 15, 0);
- AOIsetPalette(11, 8, 15, 15);
- AOIsetPalette(12, 15, 0, 8);
- AOIsetPalette(13, 15, 0, 15);
- AOIsetPalette(14, 15, 15, 0);
- AOIsetPalette(15, 15, 15, 15);
-
- for (i = 0; i <= 450; i+= 30) AOIboxFull(0, i, 639, i + 30, i / 30);
-
- AstringD.sx = 16; /* AOIstring使用例 */
- AstringD.sy = 16;
- AstringD.ax = 8;
- AstringD.ay = 16;
- AstringD.sc = 15;
- AstringD.ss = 0x02;
- AOIstring(100, 100, &AstringD, "あいうえおjkjkjk");
-
- AOIline(0, 0, 639, 399, 6); /* AOIline使用例 */
-
- AOIbox(100, 100, 200, 399, 7); /* AOIbox使用例 */
-
- AOIboxFull(201, 100, 599, 200, 1); /* AOIboxFull使用例 */
-
- if ((fp = fopen("Q:\\fj2\\font\\minn60.fnt", "rb")) == NULL) {
- perror("minn60.fnt のオープンを失敗しました");
- }
- AOIstring_FJ2(fp, 60, 300, 100, "文字列ABC", 14, 0);
- fclose(fp);
-
- AOIwinBase(250, 150, 350, 200, 1); /* AOIwinBase使用例 */
-
- AOIbuttonBase(255, 155, 340, 16); /* AOIbuttonBase使用例 */
-
- AstringD.sx = 12; /* AOIstring使用例 */
- AstringD.sy = 12;
- AstringD.ax = 6;
- AstringD.ay = 12;
- AstringD.sc = BLACK;
- AstringD.ss = 0x01;
- AOIstring(300, 168, &AstringD, "ウインドゥの試作版です");
-
- }
-
-
- #endif